package com.itheima.logger;

import org.aopalliance.intercept.Joinpoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 * @author huyoufu <https://github.com/huyoufu>
 * @TIME 2020-08-07 11:30
 * @description
 *
 * 写增强的逻辑的增强逻辑 切面类 通知类
 * 抽取一些增强逻辑方法
 *
 *
 */

public class LoggerAspect {



    public void logBefore(){
        System.out.println("原本对象就要执行方法之前***************");

    }

    public void logCommon(){
        System.out.println("原本对象的方法之后正常运行了 会执行了....");

    }

    public void logFinal(){
        System.out.println("原本对象的方法执行最终**************");

    }



    public void logException(){
        System.out.println("方法执行的时候出现异常了");
    }



    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        Object result=null;
        System.out.println("环绕通知前....");

        try {
            //有原本的方法吗?
            Object[] args = joinPoint.getArgs();
            System.out.println("获取原本对象的执行那一刻传递的参数!!!"+ Arrays.toString(args));

            Class<? extends ProceedingJoinPoint> pointClass = joinPoint.getClass();
            System.out.println("原本对象的类:"+pointClass);

            Signature signature = joinPoint.getSignature();
            System.out.println("原本对象的方法签名:"+signature);

            //注意事项!!!!
            //1.既然搞不清原本方法是否有返回值 那么 默认都有!!!
            result = joinPoint.proceed();

            System.out.println("环绕正常运行....");
        }catch (Throwable e){
            System.out.println("环绕发生异常....");

            //注意事项!!!!
            //万一原本的方法执行了 但是有异常?
            //一种 真的do no thing 基本不会这么玩

            //二种 抛出去!!!

            throw e;


        }finally {
            System.out.println("环绕通知最终都会执行....");
        }
        return result;
    }





}
